package cn.com.aiouyi.entity;

import java.util.Date;
import java.util.UUID;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import lombok.Getter;
import lombok.Setter;

/**
 * Entity - 用户
 * @author hanson
 * 
 */
@Getter
@Setter
@Entity
@Table(name = "t_member")
public class Member extends BaseEntity<Long>{
	
	private static final long serialVersionUID = -4335743912588674333L;
	
	/** "登录令牌"Cookie名称 */
	public static final String LOGIN_TOKEN_COOKIE_NAME = "loginToken";
	
	/** 用户类型 */
	public static enum Type{
		/** 管理员 */
		admin;
	}
	
	/**
	 * 性别
	 */
	public enum Gender {
		/** 男 */
		male,
		/** 女 */
		female
	}
	
// --- 基础字段  start
	
	/** 用户类型，默认是系统管理员 */
	@Enumerated(EnumType.STRING)
	private Type type = Type.admin;
	
	/** 用户名 */
    @NotBlank(message = "{validator.member.username.notBlank}")
    @Pattern(regexp = "^[a-zA-Z_]\\w{4,19}$", message = "{validator.member.username.pattern}")
    private String username;

    /** 密码 */
    @NotBlank(message = "{validator.member.password.notBlank}")
    private String password;

    /** 姓名 */
    @Length(min = 2, max = 6, message = "{validator.member.name.length}")
    private String name;

    /** 性别，默认男 */
    @Enumerated(EnumType.STRING)
    private Gender gender = Gender.male;
    
    /** 年龄 */
    @Range(min = 1, max = 199, message = "{validator.member.age.length}")
    private Integer age;

    /** 昵称 */
	private String nickname;
	
	/** 头像 */
	private String icon;
	
	/** 是否启用 ，默认true*/
	private Boolean isEnabled = true;
	
	/** 是否锁定 ，默认false*/
	private Boolean isLocked = false;
	
	/** 连续登录失败次数 */
	private Integer loginFailureCount = 0;
	
	/** 锁定日期 */
	private Date lockedDate;
	
	/** 锁定KEY */
	private String lockKey;
	
	/** 最后登录IP */
	private String lastLoginIp;
	
	/** 最后登录日期 */
	private Date lastLoginDate;
	
 // --- 基础字段  end
    
    
    /**
	 * 持久化前处理，做一些简单的数据初始化操作
	 * 调用insert方法插入数据时才会执行
	 */
	@PrePersist
	public void prePersist() {
		setUsername(StringUtils.lowerCase(getUsername()));
		setLockKey(DigestUtils.md5Hex(UUID.randomUUID() + RandomStringUtils.randomAlphabetic(30)));
	}
}
